Для создания динамических меню используются диапазоны обработчиков команд описанные в прошлом шаге. Здесь мы сконцентрируемся непосредственно на управлении меню. Для этого используем проект созданный в прошлом шаге. Для начала научимся добавлять к меню полосу разделения MF_SEPARATOR. В меню Edit создадим новый пункт меню Add Separator и привяжем к нему функцию обработки в классе вида.
void CTestRangeView::OnEditAddseparator()
{
// TODO: Add your command handler code here
}
Заведем указатель на класс меню (CMenu). И установим этот указатель непосредственно на наше меню. Дальше нам придется проверить, что мы действительно этот указатель получили с помощью ASSERT.
void CTestRangeView::OnEditAddseparator()
{
CMenu *cm;
cm=AfxGetMainWnd()->GetMenu();
ASSERT(cm != NULL);
}
Теперь нам нужно получить указатель на пункт меню. Это мы сделаем используя еще один класс меню и функцию GetSubMenu.
void CTestRangeView::OnEditAddseparator()
{
CMenu *cm;
CMenu *cmSub;
cm=AfxGetMainWnd()->GetMenu();
ASSERT(cm != NULL);
cmSub=cm->GetSubMenu(4);
ASSERT(cmSub != NULL);
}
Здесь нужно указать позицию. Счет позиций начинается с нуля. И теперь мы можем добавить в меню полосу разделения.
void CTestRangeView::OnEditAddseparator()
{
.......
ASSERT(cmSub != NULL);
cmSub->AppendMenu(MF_SEPARATOR);
}
Если Вы посмотрите на меню Test, то увидите, что полоса меню добавилась. Теперь давайте попробуем добавить пункты меню. Для этого нам нужно добавить идентификаторы этих пунктов. В файл Resource.h для того, чтобы эти идентификаторы больше не использовались.
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by TestRange.rc
//
#...........
#define ID_TEST_MENU3 32773
//----- NEW----
#define ID_TEST_MENU4 32777
#define ID_TEST_MENU5 32778
//-------------
#define ID_EDIT_ADDSEPARATOR 32774
// Next default values for new objects
......
Мы теперь можем добавлять динамически и пункты меню. Вот так используя идентификатор.
void CTestRangeView::OnEditAddseparator()
{
.....
ASSERT(cmSub != NULL);
cmSub->AppendMenu(MF_SEPARATOR);
cmSub->AppendMenu(MF_STRING,ID_TEST_MENU4,"Menu4");
cmSub->AppendMenu(MF_STRING,ID_TEST_MENU5,"Menu5");
}
Если Вы сейчас запустите приложение, то увидите, что несмотря на то, что эти пункты меню добавляются они неактивные. Естественно нужно изменить диапазон в обработчике команд. Вот так:
BEGIN_MESSAGE_MAP(CTestRangeView, CView) ....... ON_COMMAND_RANGE(ID_TEST_MENU1,ID_TEST_MENU5,onColor) END_MESSAGE_MAP()
Теперь они будут активными и смогут обрабатываться. Вы увидите это по окну сообщения.